﻿Public Class FrmTraslado

    Private COD_BD_PROD_1, COD_BD_PROD_2 As String

    Private Sub FrmTraslado_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim tool As New Tools
        cargartext()
        cargarCmbBgas()
        tbFecha.Text = tool.fecha
        btImprimir.Enabled = False

    End Sub

    Protected Overrides Sub bnNuevo_Click(sender As Object, e As System.EventArgs)
        MyBase.bnNuevo_Click(sender, e)
        cargartext()
        gbProducto2.Enabled = False
        nuevo()
        gvProducto.Rows.Clear()
        agregarEventos()
        btImprimir.Enabled = False
    End Sub

    Protected Overrides Sub bnGuardar_Click(sender As Object, e As System.EventArgs)
        If validarCampos() Then
            If validarCantidades() Then
                If guardar() Then
                    MyBase.bnGuardar_Click(sender, e)
                    btImprimir.Enabled = True

                    If msnBox.msnQuestion("¿Imprimir Reporte de traslados?") = Windows.Forms.DialogResult.Yes Then
                        imprimirTraslado()
                    End If

                End If
            End If
        End If
    End Sub

    Protected Overrides Sub bnCancelar_Click(sender As Object, e As System.EventArgs)
        nuevo()
        MyBase.bnCancelar_Click(sender, e)
        cargartext()
    End Sub

    Protected Overrides Sub bnEliminar_Click(sender As Object, e As System.EventArgs)
        If tbObservacion.TextLength < 1 Then
            msnBox.msnExclamacion("Digite la Observacion")
            Exit Sub
        End If
        If msnBox.msnQuestion("Esta seguro de anular el traslado numero: " + tbNumTraslado.Text) = Windows.Forms.DialogResult.Yes Then

            Dim result As GBDZafiro.Resultado
            Dim mTraslado As GBDZafiro.Mtraslado = crearMTraslado()
            mTraslado.COD_USU_ANULA = mTraslado.COD_USUARIO
            mTraslado.FECHA_ANULACION = Now
            mTraslado.OBS_ANULACION = mTraslado.OBSERVACION
            result = GBDZafiro.Mtraslado.Actualizar(mTraslado)


            If result.ExisteError Then
                msnBox.msnError(result.Mensaje)
            Else
                gvProducto.Rows.Clear()
                btImprimir.Enabled = False
                MyBase.bnEliminar_Click(sender, e)
            End If

            cargartext()
        End If
    End Sub

    Private Sub btBuscar1_Click(sender As System.Object, e As System.EventArgs) Handles btBuscar1.Click
        nuevo()
        Dim tool As New Tools
        Dim prod As GBDZafiro.Producto = tool.buscarProducto()
        If prod IsNot Nothing Then
            If GBDZafiro.Equivalencia.exisEqui(prod.codProducto) Then

                cmbBga1_SelectedIndexChanged(sender, e)

                cargarProd(prod, 1)
                gbProducto2.Enabled = True
                btAgregar.Enabled = True
                btBuscar2.Enabled = True

                btBuscar1.Focus()
            Else
                msnBox.msnError("Este Producto no presenta Conversión, ingrese primero la conversión e intente de nuevo")
            End If
        End If
    End Sub

    Private Sub btBuscar2_Click(sender As System.Object, e As System.EventArgs) Handles btBuscar2.Click
        Dim tool As New Tools
        Dim prod As GBDZafiro.Producto = tool.buscarProducto()
        If prod IsNot Nothing Then
            If GBDZafiro.Equivalencia.exisEqui(prod.codProducto) Then

                cmbBga2_SelectedIndexChanged(sender, e)

                cargarProd(prod, 2)
                agregarEqui()
            Else
                msnBox.msnError("Este Producto no presenta Conversión, ingrese primero la conversión e intente de nuevo")
            End If
        End If
    End Sub

    Private Sub btAgregar_Click(sender As System.Object, e As System.EventArgs) Handles btAgregar.Click
        Dim prodBga As GBDZafiro.ProductoBodega

        If COD_BD_PROD_1 Is Nothing OrElse COD_BD_PROD_1.Length < 1 Then
            prodBga = (New Tools).agregarProdBga(tbProducto1.Text, cmbBga1.SelectedValue)
            COD_BD_PROD_1 = prodBga.codBdProd
        End If

        If COD_BD_PROD_2 Is Nothing OrElse COD_BD_PROD_2.Length < 1 Then
            prodBga = (New Tools).agregarProdBga(tbProducto2.Text, cmbBga2.SelectedValue)
            COD_BD_PROD_2 = prodBga.codBdProd
        End If

        If camposCompletos() Then
            gvProducto.Rows.Add(tbProducto1.Text, tbDescripcion1.Text.ToUpper, tbUnd1.Text, cmbBga1.SelectedValue, tbcantSalida.Text, _
                            tbProducto2.Text, tbDescripcion2.Text.ToUpper, tbUnd2.Text, cmbBga2.SelectedValue, tbCantEntrada.Text, _
                            tbExisBga1.Text, tbExisBga2.Text, COD_BD_PROD_1, COD_BD_PROD_2)
            nuevo()
            tbProducto2.Enabled = False
            btBuscar2.Enabled = False
            btDeshacer.Enabled = True
            btAgregar.Enabled = False
            tbProducto1.Focus()
        End If

    End Sub

    Private Sub btDeshacer_Click(sender As System.Object, e As System.EventArgs) Handles btDeshacer.Click
        Dim rprod As DataGridViewRow = gvProducto.CurrentRow
        gvProducto.Rows.Remove(rprod)
    End Sub

    Private Sub btCancelar1_Click(sender As System.Object, e As System.EventArgs) Handles btCancelar1.Click
        nuevo()
    End Sub

    Private Sub btImprimir_Click(sender As System.Object, e As System.EventArgs) Handles btImprimir.Click
        imprimirTraslado()
    End Sub

    Private Sub tbcantSalida_KeyPress(sender As System.Object, e As System.Windows.Forms.KeyPressEventArgs) Handles tbcantSalida.KeyPress
        Validaciones.SoloNumeros(sender, e)
    End Sub

    Private Sub tbNumTraslado_KeyPress(sender As System.Object, e As System.Windows.Forms.KeyPressEventArgs) Handles tbNumTraslado.KeyPress
        Validaciones.SoloNumeros(sender, e)
    End Sub

    Private Sub cmbBga1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs)
        Dim prodBga As GBDZafiro.ProductoBodega = crearProdBga(tbProducto1.Text, cmbBga1.SelectedValue)
        tbExisBga1.Text = prodBga.existencia
        COD_BD_PROD_1 = prodBga.codBdProd
    End Sub

    Private Sub cmbBga2_SelectedIndexChanged(sender As System.Object, e As System.EventArgs)
        Dim prodBga As GBDZafiro.ProductoBodega = crearProdBga(tbProducto2.Text, cmbBga2.SelectedValue)
        tbExisBga2.Text = prodBga.existencia
        COD_BD_PROD_2 = prodBga.codBdProd
    End Sub

    Private Sub tbcantSalida_Leave(sender As System.Object, e As System.EventArgs) Handles tbcantSalida.Leave

        'If tbExisBga1.TextLength < 1 Then
        '    msnBox.msnExclamacion("No hay existencias en bodega!!!")
        '    tbcantSalida.Clear()
        '    btCancelar1.Focus()
        '    Exit Sub
        'End If

        If tbcantSalida.TextLength < 1 Then
            Exit Sub
        End If

        Dim a As Decimal = CDec(tbExisBga1.Text)
        Dim b As Decimal = CDec(tbcantSalida.Text)

        If b > a Then
            msnBox.msnExclamacion("La cantidad de salida supera la existencia en bodega!!!")
            tbcantSalida.Clear()
            tbcantSalida.Focus()
        Else
            Validaciones.formatMoney(sender)
            If tbProducto2.TextLength > 0 Then
                agregarEqui()
            End If
        End If
    End Sub

    Private Sub tbObservacion_Leave(sender As System.Object, e As System.EventArgs)
        tbProducto1.Focus()
    End Sub

    Private Sub btCancelar1_Leave(sender As System.Object, e As System.EventArgs)
        tbProducto2.Focus()
    End Sub

    Private Sub btDeshacer_Leave(sender As System.Object, e As System.EventArgs)
        gvProducto.Focus()
    End Sub

    Private Sub agregarEventos()
        AddHandler tbObservacion.Leave, AddressOf tbObservacion_Leave
        AddHandler btCancelar1.Leave, AddressOf btCancelar1_Leave
        AddHandler btDeshacer.Leave, AddressOf btDeshacer_Leave
    End Sub

    Private Sub agregarEqui()
        If tbcantSalida.TextLength < 1 Then
            'msnBox.msnExclamacion("Digite la cantidad de salida!!!")
            Exit Sub
        End If

        Dim dtEqui As DataTable
        Dim equi As New GBDZafiro.Equivalencia
        Dim a As Decimal = CDec(tbcantSalida.Text)

        equi.COD_PRODUCTO = tbProducto1.Text
        equi.COD_PRODUCTO_1 = tbProducto2.Text

        dtEqui = GBDZafiro.Equivalencia.consxCodProd1CodProd2(equi)
        If dtEqui.Rows.Count > 0 Then
            For Each rEqui As DataRow In dtEqui.Rows
                tbCantEntrada.Text = (a / rEqui("CANTIDAD")) * rEqui("EQUIVALE")
            Next
        Else

            equi.COD_PRODUCTO = tbProducto2.Text
            equi.COD_PRODUCTO_1 = tbProducto1.Text
            dtEqui = GBDZafiro.Equivalencia.consxCodProd1CodProd2(equi)

            If dtEqui.Rows.Count > 0 Then
                For Each rEqui As DataRow In dtEqui.Rows
                    tbCantEntrada.Text = (a / rEqui("EQUIVALE")) * rEqui("CANTIDAD")
                Next
            Else

            End If
        End If

    End Sub

    Private Sub cargarProd(ByRef prod As GBDZafiro.Producto, i As Integer)
        Dim prodBga As GBDZafiro.ProductoBodega
        prodBga = crearProdBga(prod.codProducto, prod.bdReferencia)

        Select Case i
            Case 1
                tbProducto1.Text = prod.codProducto
                tbExistencia1.Text = prod.existencia
                tbUnd1.Text = prod.idUniMed
                tbDescripcion1.Text = prod.descripcion
                cmbBga1.SelectedValue = prod.bdReferencia
                tbExisBga1.Text = prodBga.existencia

            Case 2
                tbProducto2.Text = prod.codProducto
                tbExistencia2.Text = prod.existencia
                tbUnd2.Text = prod.idUniMed
                tbDescripcion2.Text = prod.descripcion
                cmbBga2.SelectedValue = prod.bdReferencia

                If prodBga.codBdProd IsNot Nothing Then
                    tbExisBga2.Text = prodBga.existencia
                End If

        End Select
    End Sub

    Private Function crearProdBga(ByRef codProd As String, ByRef bga As String) As GBDZafiro.ProductoBodega
        Dim prodBga As New GBDZafiro.ProductoBodega
        prodBga.codProducto = codProd
        prodBga.codBodega = bga

        Dim dtProdBga As DataTable = GBDZafiro.ProductoBodega.consxCodProdBga(prodBga)
        For Each rProdBga As DataRow In dtProdBga.Rows
            If rProdBga("EXISTENCIA") Is Nothing Then
                prodBga.existencia = "0"
            Else
                prodBga.existencia = rProdBga("EXISTENCIA").ToString
            End If


            prodBga.codBdProd = rProdBga("COD_BD_PROD")
        Next
        Return prodBga
    End Function

    Private Sub cargarCmbBgas()
        cmbBga1.DataSource = GBDZafiro.Bodega.ConsultarAll
        cmbBga2.DataSource = GBDZafiro.Bodega.ConsultarAll

        cmbBga1.ValueMember = "COD_BODEGA"
        cmbBga2.ValueMember = "COD_BODEGA"

        cmbBga1.DisplayMember = "COD_BODEGA"
        cmbBga2.DisplayMember = "COD_BODEGA"

        AddHandler cmbBga1.SelectedIndexChanged, AddressOf cmbBga1_SelectedIndexChanged
        AddHandler cmbBga2.SelectedIndexChanged, AddressOf cmbBga2_SelectedIndexChanged
    End Sub

    Private Sub cargartext()
        gbProducto1.Text = "Información del producto de Salida"
        gbProducto2.Text = "Información del producto de Entrada"
    End Sub

    Private Sub nuevo()
        For Each ctr As Control In gbProducto1.Controls
            If Not TypeOf ctr Is Label And Not TypeOf ctr Is Button Then
                ctr.Enabled = True
                ctr.Text = ""
            End If
        Next
        For Each ctr As Control In gbProducto2.Controls
            If Not TypeOf ctr Is Label And Not TypeOf ctr Is Button Then
                ctr.Enabled = True
                ctr.Text = ""
            End If
        Next
        'gbProducto2.Enabled = True
        tbNumTraslado.Focus()
    End Sub

    Private Function guardar() As Boolean

        Dim mTras As GBDZafiro.Mtraslado = crearMTraslado()

        Dim dtTraslado As DataTable = crearDtDTraslado()
        Dim result As GBDZafiro.Resultado = GBDZafiro.Mtraslado.Nuevo(mTras)

        If result.ExisteError Then
            msnBox.msnError(result.Mensaje)
            Return False
            Exit Function
        Else
            tbNumTraslado.Text = result.NumSoporte
            result = GBDZafiro.Dtraslado.nuevo(dtTraslado, tbNumTraslado.Text)
            If result.ExisteError Then
                msnBox.msnError(result.Mensaje)
                Return False
                Exit Function
            End If
        End If

        Return True

    End Function

    Private Function crearDtDTraslado() As DataTable
        Dim dtDTraslado As New DataTable

        dtDTraslado.Columns.Add("COD_BD_PROD_1")
        dtDTraslado.Columns.Add("CANTIDAD1")
        dtDTraslado.Columns.Add("COD_BD_PROD_2")
        dtDTraslado.Columns.Add("CANTIDAD2")
        dtDTraslado.Columns.Add("EXISTE_1")
        dtDTraslado.Columns.Add("EXISTE_2")
        dtDTraslado.Columns.Add("CODIGO1")
        dtDTraslado.Columns.Add("DESCRIPCION1")
        dtDTraslado.Columns.Add("CODIGO2")
        dtDTraslado.Columns.Add("DESCRIPCION2")

        dtDTraslado.Columns.Add("UNIDAD1")
        dtDTraslado.Columns.Add("BD1")
        dtDTraslado.Columns.Add("UNIDAD2")
        dtDTraslado.Columns.Add("BD2")

        For Each rTraslado As DataGridViewRow In gvProducto.Rows
            dtDTraslado.Rows.Add(rTraslado.Cells("COD_BD_PROD1").Value, rTraslado.Cells("CANTIDAD1").Value, _
                                 rTraslado.Cells("COD_BD_PROD2").Value, rTraslado.Cells("CANTIDAD2").Value, _
                                 rTraslado.Cells("EXISTE_1").Value, rTraslado.Cells("EXISTE_2").Value,
                                 rTraslado.Cells("CODIGO1").Value, rTraslado.Cells("DESCRIPCION1").Value, _
                                 rTraslado.Cells("CODIGO2").Value, rTraslado.Cells("DESCRIPCION2").Value, _
                                 rTraslado.Cells("UNIDAD1").Value, rTraslado.Cells("BD1").Value, _
                                 rTraslado.Cells("UNIDAD2").Value, rTraslado.Cells("BD2").Value)
          
        Next

        Return dtDTraslado
    End Function

    Private Function crearDtTraslado() As DataTable
        Dim dtTraslado As New DataTable
        dtTraslado.Columns.Add("COD_PRODUCTO")
        dtTraslado.Columns.Add("ID_UNIDAD_MEDIDA")
        dtTraslado.Columns.Add("DESCRIPCION")
        dtTraslado.Columns.Add("CANTIDAD", System.Type.GetType("System.Decimal"))
        dtTraslado.Columns.Add("COD_BODEGA")
        dtTraslado.Columns.Add("MOVIMIENTO")

        For Each rTraslado As DataGridViewRow In gvProducto.Rows
            dtTraslado.Rows.Add(rTraslado.Cells("CODIGO1").Value, rTraslado.Cells("UNIDAD1").Value, _
                                rTraslado.Cells("DESCRIPCION1").Value, rTraslado.Cells("CANTIDAD1").Value, _
                                rTraslado.Cells("BD1").Value, "Salida")

            dtTraslado.Rows.Add(rTraslado.Cells("CODIGO2").Value, rTraslado.Cells("UNIDAD2").Value, _
                                rTraslado.Cells("DESCRIPCION2").Value, rTraslado.Cells("CANTIDAD2").Value, _
                                rTraslado.Cells("BD2").Value, "Entrada")
           
        Next

        Return dtTraslado
    End Function

    Private Function crearMTraslado()
        Dim MTraslado As New GBDZafiro.Mtraslado
        MTraslado.NUM_TRASLADO = tbNumTraslado.Text.ToUpper
        MTraslado.COD_USUARIO = Login.usuario.codUsuario
        MTraslado.OBSERVACION = tbObservacion.Text.ToUpper
        MTraslado.ESTADO = "A"
        MTraslado.FECHA_TRASLADO = dtpFecha.Value
        Return MTraslado
    End Function

    Private Function validarCampos() As Boolean
        If gvProducto.Rows.Count < 1 Then
            msnBox.msnExclamacion("No ha agregado ningun traslado!!!")
            Return False
            Exit Function
        End If
        Return True
    End Function

    Private Function camposCompletos() As Boolean

        For Each Ctr As Control In gbProducto1.Controls
            If TypeOf Ctr Is TextBox And Ctr.Text.Length < 1 Then
                msnBox.msnExclamacion("Complete todos los campos para agregar")
                Return False
                Exit Function
            End If
        Next

        For Each Ctr As Control In gbProducto2.Controls
            If TypeOf Ctr Is TextBox And Ctr.Text.Length < 1 Then
                msnBox.msnExclamacion("Complete todos los campos para agregar")
                Return False
                Exit Function
            End If
        Next

        Return True
    End Function

    Private Function validarCantidades() As Boolean
        Dim a, b As Integer
        Dim prodBga As GBDZafiro.ProductoBodega

        For Each rDTraslado As DataGridViewRow In gvProducto.Rows
            prodBga = crearProdBga(rDTraslado.Cells("CODIGO1").Value, rDTraslado.Cells("BD1").Value)

            a = CDec(rDTraslado.Cells("CANTIDAD1").Value)
            b = CDec(prodBga.existencia)

            If a > b Then
                msnBox.msnExclamacion("La cantidad de salida del producto: " + prodBga.codProducto + " supera la existencia en bodega!!!")
                Return False
                Exit Function
            End If
        Next

        Return True
    End Function

    Private Sub imprimirTraslado()
        If validarCampos() Then
            Dim mTras As GBDZafiro.Mtraslado
            Dim usuario As GBDZafiro.Usuario

            mTras = (New Tools).crearMtraslado(tbNumTraslado.Text)
            If GBDZafiro.Mtraslado.exisMTraslado(mTras) Then
                usuario = (New Tools).crearUsuario(mTras.COD_USUARIO)

                Dim FrmRptTraslado As New FrmRptTraslado(tbNumTraslado.Text, crearDtTraslado(), _
                                                                    mTras.FECHA_TRASLADO, usuario)
                FrmRptTraslado.ShowDialog(Me)

            Else
                msnBox.msnExclamacion("El numero de Traslado no existe!!!")

            End If
           
        End If
    End Sub
   
End Class
